import 'package:flutter/material.dart';
import 'package:flutter_map_demo/t3_map_plugin/map/core/t3_annotation.dart';
import 'package:flutter_map_demo/t3_map_plugin/map/core/t3_image_option.dart';
import 'package:flutter_map_demo/t3_map_plugin/map/core/t3_location.dart';
import 'package:flutter_map_demo/t3_map_plugin/map/core/t3_polyline.dart';
import 'package:flutter_map_demo/t3_map_plugin/map/core/t3_text_option.dart';
import 'package:flutter_map_demo/t3_map_plugin/map/t3_map_controller.dart';
import 'package:flutter_map_demo/t3_map_plugin/route/route_manager/t3_map_route_manager.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:t3_data_service/biz_data_source/map/point/model/fence_group_model.dart';
import 'package:t3_data_service/data_provider/map_sctx/t3_map_sctx_provider.dart';
import 'dart:async';
import 't3_map_plugin/map/t3_map_widget.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late final T3MapWidget mapWidget;
  late final T3MapController controller;

  T3Polyline? polyline;

  List<T3Annotation>? annotations;

  int placeholder = 0;

  @override
  void initState() {
    super.initState();
    controller = T3MapController();
    mapWidget = T3MapWidget(
        mapType: T3MapType.amap,
        controller: controller,
        initialCameraPosition: const T3MapCameraPosition(
            centerCoordinate: T3LocationCoordinate2D(
                longitude: 118.811221, latitude: 31.911858)));

    controller.eventStream.onMapInitCompleted().listen((event) {
      debugPrint('onMapInitCompleted1');
    });

    controller.eventStream.regionWillChange().listen((event) {
      debugPrint('regionWillChange, ${event.value.toString()}');
    });

    controller.eventStream.regionChanged().listen((event) {
      debugPrint(
          "regionChanged，zoomLevel: ${event.value.zoomLevel}, centerCoordinate: ${event.value.centerCoordinate.toString()}");
    });

    controller.eventStream.regionDidChange().listen((event) {
      debugPrint('regionDidChange, ${event.value.toString()}');
    });

    controller.eventStream.polylineDidTap().listen((event) {
      debugPrint('polylineDidTap, ${event.value.toString()}');
    });

    controller.eventStream.annotationDidTap().listen((event) {
      debugPrint('annotationDidTap, ${event.value.toString()}');
    });
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {}

  @override
  Widget build(BuildContext context) {
    List<Widget> children = [];

    // children.add(const Text('测试platform map view'));

    for (var i = 0; i < placeholder; i++) {
      children.add(const Text('测试placeholder'));
    }

    children.addAll([
      //const Text('测试platform map view'),
      Wrap(spacing: 8, children: [
        ElevatedButton(
            onPressed: addPolylineButtonDidClicked,
            child: const Text('添加polyline')),
        ElevatedButton(
            onPressed: updatePolylineButtonDidClicked,
            child: const Text('更新polyline')),
        ElevatedButton(
            onPressed: showPolylineButtonDidClicked,
            child: const Text('可视区域内显示polyline')),
        ElevatedButton(
            onPressed: removePolylineButtonDidClicked,
            child: const Text('移除polyline')),
        ElevatedButton(
            onPressed: setupShowsUserLocatioButtonDidClicked,
            child: const Text('设置显示用户位置')),
        ElevatedButton(
            onPressed: userLocatioIsVisibleButtonDidClicked,
            child: const Text('用户位置是否可见')),
        ElevatedButton(
            onPressed: userTrackingModeButtonDidClicked,
            child: const Text('设置定位模式为跟随模式')),
        ElevatedButton(
            onPressed: setupCenterButtonDidClicked,
            child: const Text('设置中心点在百家湖')),
        ElevatedButton(
            onPressed: setupCenter1ButtonDidClicked,
            child: const Text('设置中心点在南京南站(无动画)')),
        ElevatedButton(
            onPressed: setupZoom15ButtonDidClicked,
            child: const Text('设置地图缩放级别15（无动画）')),
        ElevatedButton(
            onPressed: setupZoom17ButtonDidClicked,
            child: const Text('设置地图缩放级别17')),
        ElevatedButton(
            onPressed: setupPinAnnotationButtonDidClicked,
            child: const Text('添加地图起点大头针')),
        ElevatedButton(
            onPressed: showPinAnnotationButtonDidClicked,
            child: const Text('展示地图起点大头针')),
        ElevatedButton(
            onPressed: removePinAnnotationButtonDidClicked,
            child: const Text('移除地图起点大头针')),
        ElevatedButton(
            onPressed: showPolylineAndPinAnnotationButtonDidClicked,
            child: const Text('同时显示地图上的线段和大头针')),
        ElevatedButton(
            onPressed: setupScreenAnchor, child: const Text('设置地图锚点')),
        ElevatedButton(
            onPressed: addPolygonButtonDidClicked,
            child: const Text('添加polygon')),
        ElevatedButton(
            onPressed: removePolygonButtonDidClicked,
            child: const Text('移除polygon')),
      ]),
    ]);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
            child: Column(children: [
          SizedBox(width: 300, height: 200, child: mapWidget),
          SingleChildScrollView(
            child: Center(
              child: Column(
                children: children,
              ),
            ),
          )
        ])),
      ),
    );
  }

  void addPolylineButtonDidClicked() {
    print('t3map addPolylineButtonDidClicked');
    const List<T3LocationCoordinate2D> points = [
      T3LocationCoordinate2D(longitude: 26.91403, latitude: 119.415525),
      T3LocationCoordinate2D(longitude: 26.91703, latitude: 119.416525),
      T3LocationCoordinate2D(longitude: 26.91683, latitude: 119.417425),
      T3LocationCoordinate2D(longitude: 26.91503, latitude: 119.417625),
      T3LocationCoordinate2D(longitude: 26.91593, latitude: 119.417525),
      T3LocationCoordinate2D(longitude: 26.92593, latitude: 119.418525),
    ];

    const T3PolylineStyle style = T3PolylineStyle(
        width: 10, fillColorValue: '#0dd5e3', strokeColorValue: '#fcba03');

    final options =
        T3PolylineOptions(points: points, routeID: "001", style: style);
    polyline = controller.addPolyline(options: options);
    // if (polyline != null) {
    //   final polyline = controller.addPolyline(options: options);
    //   // controller.showPolylines(polylines: polyline, animated: true);
    // }

    // const origin = T3LocationCoordinate2D(longitude: 118.798039, latitude: 31.96875);
    // const destination = T3LocationCoordinate2D(longitude: 118.797499, latitude: 32.087104);

    // 绘制大头针

    // T3AnnotationOptions originBubbleOptions = T3AnnotationOptions.fromBubble(
    //     coordinate: origin,
    //     zIndex: 1,
    //     bubble: T3BubbleAnnotationOptions.valuation(
    //         addressTextOption: T3TextOption(
    //             text: "天安门广场",
    //             normalStyle: T3TextStyle(color: "#1d2232", fontSize: 10, fontWeight: T3FontWeight.medium)),
    //         timeTextOption: T3TextOption(
    //             text: "12分钟",
    //             normalStyle: T3TextStyle(color: "#00AD59", fontSize: 14, fontWeight: T3FontWeight.bold)),
    //         timeTipsTextOption: T3TextOption(
    //             text: "最快上车",
    //             normalStyle: T3TextStyle(color: "#A5A7AD", fontSize: 10, fontWeight: T3FontWeight.regular)),
    //         // stopInfoTextOption: T3TextOption(
    //         //   text: "此处限停12分钟",
    //         //   normalStyle: T3TextStyle(color: "#FA6400", fontSize: 8, fontWeight: T3FontWeight.regular)),
    //         imageOption: T3ImageOption(imageName: "map_icon_start_pin", width: 28, height: 28))
    // );

    // T3AnnotationOptions destinationBubbleOptions = T3AnnotationOptions.fromBubble(
    //     coordinate: destination,
    //     zIndex: 1,
    //     bubble: T3BubbleAnnotationOptions.valuation(
    //         addressTextOption: T3TextOption(
    //             text: "天安门广场",
    //             normalStyle: T3TextStyle(color: "#1d2232", fontSize: 10, fontWeight: T3FontWeight.medium)),
    //         // timeTextOption: T3TextOption(
    //         //   text: "10:51",
    //         //   normalStyle: T3TextStyle(color: "#FA6400", fontSize: 14, fontWeight: T3FontWeight.bold)),
    //         // timeTipsTextOption: T3TextOption(
    //         //   text: "预计到达",
    //         //   normalStyle: T3TextStyle(color: "#A5A7AD", fontSize: 10, fontWeight: T3FontWeight.regular)),
    //         imageOption: T3ImageOption(imageName: "map_icon_end_pin", width: 28, height: 28))
    // );
    // annotations = controller.addAnnotations([originBubbleOptions, destinationBubbleOptions]);
    //
    // controller.showAnnotations(annotations: controller.annotations, animated: true);

    // final future = T3RouteManager.getDrivingRouteUnionEndPointRecommend(
    //     mapType: T3MapType.amap,
    //     origin: origin,
    //     arriveOrigin: null,
    //     destination: destination,
    //     arriveDestination: null,
    //     viaPoints: null,
    //     originPoiId: null,
    //     destPoiId: 'cd27b7d620ffa0f',
    //     areaCode: null,//'320115',
    //     departureTime: null
    // );

    // future.then((value) {
    //   debugPrint("getWalkRoute : ${value.toString()}");
    //
    //   if (value != null) {
    //     List<T3Polyline> polylineList = [];
    //     var isFirst = true;
    //     for (var element in value.routeResult.routes) {
    //       final style = T3MultiPolylineStyle(
    //           width: 7,
    //           lineDashType: T3PolylineDashStyle.dot,
    //           lineJoinType: T3PolylineJoinStyle.round,
    //           miterLimit: 20,
    //           isSelected: isFirst ? true : false,
    //           traffic: element.traffic,
    //           fillColorValue: '#A5A7AD',
    //           strokeColorValue: '#A5A7AD');
    //
    //       final options = T3PolylineOptions(points: element.coordinates, routeID: element.routeId, style: style);
    //       final polyline = controller.addPolyline(options: options);
    //       polylineList.add(polyline);
    //       isFirst = false;
    //     }
    //
    //     controller.showPolylines(polylines: polylineList, animated: true);
    //   }
    // });
  }

  void updatePolylineButtonDidClicked() {
    print('t3map updatePolylineButtonDidClicked');
    const List<T3LocationCoordinate2D> points = [
      T3LocationCoordinate2D(longitude: 116.359406, latitude: 39.910612),
      T3LocationCoordinate2D(longitude: 116.345948, latitude: 39.910298),
      T3LocationCoordinate2D(longitude: 116.361775, latitude: 39.912964),
      T3LocationCoordinate2D(longitude: 116.366478, latitude: 39.913435),
      T3LocationCoordinate2D(longitude: 116.424897, latitude: 39.916258),
      T3LocationCoordinate2D(longitude: 116.417165, latitude: 39.91367),
    ];

    const T3PolylineStyle style = T3PolylineStyle(width: 10, fillColorValue: '#fcba03', strokeColorValue: '#fcba03');

    final options = T3PolylineOptions(points: points, routeID: "001", style: style);
    if (polyline != null) {
      print('polyline != null');
      controller.updatePolyline(polyline: polyline!, newPolylineOptions: options);
    }
  }

  void showPolylineButtonDidClicked() {
    if (polyline != null) {
      controller.showPolylines(
          polylines: [polyline!],
          edgeInsets: const EdgeInsets.all(5),
          animated: true);
    }
  }

  void removePolylineButtonDidClicked() {
    if (polyline != null) {
      controller.removePolyline(polyline: polyline!);
    }
  }

  void addPolygonButtonDidClicked() {
    print('addPolygonButtonDidClicked');
    const List<T3LocationCoordinate2D> points = [
      T3LocationCoordinate2D(longitude: 26.91403, latitude: 119.415525),
      T3LocationCoordinate2D(longitude: 26.91703, latitude: 119.416525),
      T3LocationCoordinate2D(longitude: 26.91683, latitude: 119.417425),
      T3LocationCoordinate2D(longitude: 26.91503, latitude: 119.417625),
      T3LocationCoordinate2D(longitude: 26.91593, latitude: 119.417525),
      T3LocationCoordinate2D(longitude: 26.92593, latitude: 119.418525),
    ];

    const T3PolylineStyle style = T3PolylineStyle(
        width: 10, fillColorValue: '#0dd5e3', strokeColorValue: '#fcba03');

    final options = T3PolylineOptions(points: points, style: style);
    controller.addPolygon(options: options);
  }

  void removePolygonButtonDidClicked() {
    controller.removePolygon();
  }

  void setupShowsUserLocatioButtonDidClicked() {
    controller.showsUserLocation = !controller.showsUserLocation;
  }

  Future<void> userLocatioIsVisibleButtonDidClicked() async {
    final visible = await controller.userLocationVisible;
    final msg = visible ? "可见" : "可不见";
    // Fluttertoast.showToast(
    //   msg: '用户位置: $msg',
    //   toastLength: Toast.LENGTH_SHORT,
    //   gravity: ToastGravity.BOTTOM,
    //   timeInSecForIosWeb: 1,
    //   backgroundColor: Colors.black,
    //   textColor: Colors.white,
    //   fontSize: 16.0,
    // );
  }

  void userTrackingModeButtonDidClicked() {
    controller.setupUserTrackingMode(T3UserTrackingMode.follow, animated: true);
  }

  void setupCenterButtonDidClicked() {
    controller.setupMapViewCenter(
        coordinate: const T3LocationCoordinate2D(
            longitude: 118.819984, latitude: 31.930099),
        animated: true);
  }

  void setupCenter1ButtonDidClicked() {
    controller.setupMapViewCenter(
        coordinate: const T3LocationCoordinate2D(
            longitude: 118.797984, latitude: 31.968827),
        animated: false);
  }

  void setupZoom15ButtonDidClicked() {
    controller.setupMapViewZoomLevel(level: 15, animated: false);
  }

  void setupZoom17ButtonDidClicked() {
    controller.setupMapViewZoomLevel(level: 17, animated: true);
  }

  void setupPinAnnotationButtonDidClicked() {
    T3AnnotationOptions options = T3AnnotationOptions.fromPin(
        coordinate: const T3LocationCoordinate2D(
            longitude: 116.241048, latitude: 39.970377),
        zIndex: 1,
        pin: T3PinAnnotationOptions.start(addressText: "天安门广场"));

    T3AnnotationOptions options1 = T3AnnotationOptions.fromBubble(
        coordinate: const T3LocationCoordinate2D(longitude: 116.525403, latitude: 39.947892),
        zIndex: 1,
        bubble: T3BubbleAnnotationOptions.valuation(addressTextOption: T3TextOption(text: '000', normalStyle: T3TextStyle(color: '',fontSize: 0,fontWeight: T3FontWeight.bold)), imageOption: T3ImageOption(imageName: '',height: 20,width: 20,rotation: 0)));

    T3AnnotationOptions options2 = T3AnnotationOptions.fromWait(
        coordinate: const T3LocationCoordinate2D(longitude: 116.379682, latitude: 39.868527),
        zIndex: 1, wait: T3WaitAnnotationOptions.start(addressText: "天安门广场"));


    annotations = controller.addAnnotations([options,options1,options2]);

    controller.showAnnotations(
        annotations: controller.annotations, animated: true);
  }

  void showPinAnnotationButtonDidClicked() {
    controller.showAnnotations(
        annotations: controller.annotations, animated: true);
  }

  void removePinAnnotationButtonDidClicked() {
    controller.removeAnnotations(controller.annotations);
  }

  void showPolylineAndPinAnnotationButtonDidClicked() {
    controller.showPolylinesAndAnnotations(
        polylines: controller.polylines,
        annotations: controller.annotations,
        edgeInsets: const EdgeInsets.all(0),
        animated: true);
  }

  void setupScreenAnchor() {
    controller.screenAnchor = const Offset(0.25, 0.25);
  }
}
